﻿using Autodesk.AutoCAD.DatabaseServices;
using Autodesk.AutoCAD.EditorInput;
using Autodesk.AutoCAD.Runtime;
using CADTool.DotNetARX;
using System;
using System.Collections.Generic;
using System.Globalization;
using System.Linq;
using System.Runtime.CompilerServices;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
////测试用
//[CommandMethod("CS")]
//public static void CS()
//{
//    Database db = HostApplicationServices.WorkingDatabase;
//    Editor ed = Application.DocumentManager.MdiActiveDocument.Editor;
//    using (Transaction trans = db.TransactionManager.StartTransaction())
//    {
//        //设置TrueType字体（仿宋体）
//        ObjectId styleId = db.AddTextStyle("仿宋体", "simfang.ttf");
//        DBText txt1 = new DBText();
//        txt1.TextString = "仿宋体";
//        txt1.TextStyleId = styleId;
//        txt1.Height = 2;
//        //设置SHX字体（romans）
//        styleId = db.AddTextStyle("罗马字体", "romans", "gbcbig");
//        DBText txt2 = new DBText();
//        txt2.TextString = "罗马字体";
//        txt2.TextStyleId = styleId;
//        txt2.Height = 2;
//        //设置SHX字体（romans）
//        styleId = db.AddTextStyle("垂直罗马字体", "romans", "gbcbig");
//        //设置文字的各种属性
//        styleId.SetTextStyleProp(2.0, 0.67, 15 * Math.PI / 180, true, true, true, AnnotativeStates.True, true);
//        DBText txt3 = new DBText();
//        txt3.TextString = "垂直罗马字体";
//        txt3.TextStyleId = styleId;
//        //设置TrueType字体(宋体),并且有加粗、倾斜效果
//        styleId = db.AddTextStyle("加粗倾斜字体", "宋体", true, true, 0, 0);
//        DBText txt4 = new DBText();
//        txt4.TextString = "加粗倾斜字体";
//        txt4.TextStyleId = styleId;
//        db.AddToModelSpace(txt1, txt2, txt3, txt4);
//        txt3.SetFromTextStyle();
//        trans.Commit();
//    }
//}

namespace CADTool.DotNetARX
{
    /// <summary>
    /// Charset枚举值 设置字体的字符集
    /// </summary>
    public enum FontCharSet
    {
        Ansi = 0,       //英文
        Default = 1,     //与当前操作系统语言有关
        GB2312 = 134,     //简体中文
        Big5 = 136,       //繁体中文
        OEM = 255         //与操作系统有关
    }
    /// <summary>
    /// Pitch设置字体的字宽
    /// </summary>
    public enum FontPitch
    {
        Default = 0,    //默认字宽
        Fixed = 1,      //固定字宽
        Variable = 2    //可变字宽
    }
    public enum FontFamily
    {
        Default = 0,    //使用默认字体
        Roman = 16,       //可变的笔画宽度，有衬线，如MS Serif字体
        Swiss = 32,       //可变的笔画宽度，无衬线，如MS Sans Serif 字体
        Modern = 48,      //固定笔画宽度，衬线可以有也可以没有
        Script = 64,      //手写体，如Cursive字体
        Decorative = 80   //小说字体，如旧式英语
    }
    public static class TextStyleTools
    {
        /// <summary>
        /// 创建一个新的文字样式
        /// </summary>
        /// <param name="db">数据库对象</param>
        /// <param name="styleName">文字样式名</param>
        /// <param name="fontFileName">字体文件名</param>
        /// <param name="bigFontFileName">大字体文件名</param>
        /// <returns>返回添加的文字样式的Id</returns>
        public static ObjectId AddTextStyle(this Database db, string styleName, string fontFileName, string bigFontFileName)
        {
            //打开文字样式表
            TextStyleTable tst = (TextStyleTable)db.TextStyleTableId.GetObject(OpenMode.ForRead);
            if (!tst.Has(styleName)) //如果不存在名为styleName的文字样式，则新建一个文字样式
            {
                //定义一个新的文字样式表记录
                TextStyleTableRecord tstr = new TextStyleTableRecord();
                tstr.Name = styleName;                    //设置文字样式名
                tst.UpgradeOpen();                       //设置文字样式表的状态为可写
                tstr.FileName = fontFileName;             //设置字体文件名
                tstr.BigFontFileName = bigFontFileName;   //设置大字体文件名称
                tst.Add(tstr);
                tst.DowngradeOpen();                     //为了安全将文字样式表切换为读
            }
            return tst[styleName];                       //返回新添加的文字样式表记录的ObjectId
        }
        /// <summary>
        /// 创建一个新的文字样式
        /// </summary>
        /// <param name="db">数据库对象</param>
        /// <param name="styleName">文字样式名</param>
        /// <param name="fontFileName">字体文件名</param>
        /// <returns>返回添加的文字样式Id</returns>
        public static ObjectId AddTextStyle(this Database db, string styleName, string fontFileName)
        {
            return db.AddTextStyle(styleName, fontFileName, "");
        }
        /// <summary>
        /// 创建一个新的文字样式
        /// </summary>
        /// <param name="db">数据库对象</param>
        /// <param name="styleName">文字样式名</param>
        /// <param name="fontName">字体文件名</param>
        /// <param name="bold">是否加粗</param>
        /// <param name="italic">是否倾斜</param>
        /// <param name="charset">设置字体的字符集</param>
        /// <param name="pitchAndFamily">设置字体的字宽和语系定义</param>
        /// <returns>返回添加的文字样式的Id</returns>
        public static ObjectId AddTextStyle(this Database db, string styleName, string fontName, bool bold, bool italic, int charset, int pitchAndFamily)
        {
            //打开文字样式表
            TextStyleTable tst = (TextStyleTable)db.TextStyleTableId.GetObject(OpenMode.ForRead);
            if (!tst.Has(styleName)) //如果不存在名为styleName的文字样式，则新建文字样式
            {
                //定义一个文字样式表记录
                TextStyleTableRecord tstr = new TextStyleTableRecord();
                tstr.Name = styleName;  //设置文字样式名
                //设置文字样式的字体
                tstr.Font = new Autodesk.AutoCAD.GraphicsInterface.FontDescriptor(fontName, bold, italic, charset, pitchAndFamily);
                tst.UpgradeOpen();
                tst.Add(tstr);
                db.TransactionManager.AddNewlyCreatedDBObject(tstr, true);
                tst.DowngradeOpen();
            }
            return tst[styleName];
        }
        /// <summary>
        /// 设置文字样式的有关属性
        /// </summary>
        /// <param name="styleId">文字样式表记录</param>
        /// <param name="textSize">高度</param>
        /// <param name="xsacle">宽度因子</param>
        /// <param name="obliquingAngle">倾斜角度</param>
        /// <param name="isVertical">是否垂直</param>
        /// <param name="upsideDown">是否上线颠倒</param>
        /// <param name="backwards">是否反向</param>
        /// <param name="annotative">是否具有注释性</param>
        /// <param name="paperOrientation">文字方向与布局是否相匹配</param>
        public static void SetTextStyleProp(this ObjectId styleId, double textSize, double xsacle, double obliquingAngle, bool isVertical, bool upsideDown,
            bool backwards, AnnotativeStates annotative, bool paperOrientation)
        {
            TextStyleTableRecord tstr = styleId.GetObject(OpenMode.ForWrite) as TextStyleTableRecord;
            if (tstr == null) return; //如果styleId表示是不是文字样式表记录，则返回
            tstr.TextSize = textSize; 
            tstr.XScale = xsacle;       
            tstr.ObliquingAngle = obliquingAngle;  
            tstr.IsVertical = isVertical;  
            tstr.FlagBits = (byte)0;
            tstr.FlagBits += upsideDown ? (byte)2 : (byte)0; 
            tstr.FlagBits += backwards ? (byte)4 : (byte)0; 
            tstr.Annotative = annotative; 
            tstr.SetPaperOrientation(paperOrientation); 
            tstr.DowngradeOpen();
        }
    }
}
